package com.lk.sys.service.impl;

import com.lk.sys.common.exception.ServiceException;
import com.lk.sys.common.vo.CheckBox;
import com.lk.sys.common.vo.PageObject;
import com.lk.sys.common.vo.SysRoleMenuVo;
import com.lk.sys.dao.SysRoleDao;
import com.lk.sys.dao.SysRoleMenuDao;
import com.lk.sys.dao.SysUserRoleDao;
import com.lk.sys.entity.SysRole;
import com.lk.sys.service.SysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
public class SysRoleServiceImpl implements SysRoleService {

    @Autowired
    private SysRoleDao sysRoleDao;

    @Autowired
    private SysRoleMenuDao sysRoleMenuDao;

    @Autowired
    private SysUserRoleDao sysUserRoleDao;

    /**
     * 查询所有角色id和角色名称
     * @author Lukang
     * @date 2022/1/2 下午4:15
     * @return java.util.List<com.lk.sys.common.vo.CheckBox>
     */
    @Override
    public List<CheckBox> findRoles() {
        List<CheckBox> roles = sysRoleDao.findRoles();
        return roles;
    }

    /**
     * 更新角色本身信息和角色菜单关系信息
     * @author Lukang
     * @date 2021/12/16 下午9:42
     * @param entity
     * @param menuIds
     * @return int
     */
    @Override
    public int updateObject(SysRole entity, Integer[] menuIds) {
        //1.参数校验
        if (entity == null) throw new IllegalArgumentException("角色对象不能为空");
        if (StringUtils.isEmpty(entity.getName())) throw new IllegalArgumentException("角色名称不能为空");
        if (menuIds==null || menuIds.length==0) throw new IllegalArgumentException("权限不能为空");
        //2.更新参数
        //2.1更新角色数据
        int rows = sysRoleDao.updateObject(entity);
        //2.2删除角色与菜单关系
        sysRoleMenuDao.deleteObjectByRoleId(entity.getId());
        //2.3插入新的角色与菜单信息
        sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
        return rows;
    }

    /**
     * 通过角色id查询SysRoleMenuVo对象，包括角色信息及角色对应菜单id信息
     * @author Lukang
     * @date 2021/12/22 下午9:08
     * @param id
     * @return com.lk.sys.common.vo.SysRoleMenuVo
     */
    @Override
    public SysRoleMenuVo findObjectByRoleId(Integer id) {
        //参数校验
        if (id == null || id <= 0)
            throw new IllegalArgumentException("id值不合法");
        //获取参数并进行校验
        SysRoleMenuVo result = sysRoleDao.findObjectById(id);
        if (result == null)
            throw new ServiceException("此记录已不存在");
        return result;
    }

    /**
     * 保存角色本身信息和角色菜单关系信息
     * @author Lukang
     * @date 2021/12/16 下午9:42
     * @param entity
     * @param menuIds
     * @return int
     */
    @Override
    public int saveObject(SysRole entity, Integer[] menuIds) {
        //1.参数校验
        if (entity == null) throw new IllegalArgumentException("角色对象不能为空");
        if (StringUtils.isEmpty(entity.getName())) throw new IllegalArgumentException("角色名称不能为空");
        if (menuIds==null || menuIds.length==0) throw new IllegalArgumentException("权限不能为空");
        //2.保存参数
        //2.1保存角色数据
        int rows = sysRoleDao.insertObject(entity);
        //2.1保存角色菜单关系数据
        sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
        return rows;
    }

    @Override
    public PageObject<SysRole> findPageObjects(String name, Long pageCurrent) {
        //1.校验参数
        if (pageCurrent == null || pageCurrent < 1)
            throw new IllegalArgumentException("当前页码值无效");
        //2。查询总记录数并校验参数
        long rowCount = sysRoleDao.getRowCount(name);
        if (rowCount == 0)
            throw new ServiceException("没有找到对应记录");
        //3。查询当前页面的数据
        int pageSize = 5;
        Long startIndex = (pageCurrent - 1) * pageSize;
        List<SysRole> records = sysRoleDao.findPageObjects(name, startIndex, pageSize);
        //4。封装数据
        return new PageObject<>(records, rowCount, pageSize, pageCurrent);
    }

    /**
     * 基于角色id删除选中的角色数据，要先删除角色菜单关联数据和用户角色关联数据，再删除角色数据
     * @author Lukang
     * @date 2021/12/8 下午10:06
     * @param id
     * @return int
     */
    @Override
    public int deleteObjectById(Integer id) {
        //参数校验
        if (id == null || id < 1)
            throw new IllegalArgumentException("参数值不正确");
        //删除角色菜单关联数据
        sysRoleMenuDao.deleteObjectRoleMenuId(id);
        //删除用户角色关联数据
        sysUserRoleDao.deleteObjectByRoleId(id);
        //删除角色数据
        int row = sysRoleDao.deleteObjectById(id);
        if (row == 0)
            throw new RuntimeException("参数可能已经不存在");
        return row;
    }
}
